﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;

namespace Biblioteca.Logica_Negocio.Domain_Model
{

    
    [Table("Materiales")]
    public class Material
    {

        public Material()
        {
        }

        public Material(int id, string titulo, TipoMaterial tipo, int codigo, string sinopsis, Editorial editorial, IList<Autor> autores, IList<Tema> temas)
        {
            this.Id = id;
            this.Titulo = titulo;
            this.Codigo = codigo;
            this.Tipo = tipo;
            this.Temas = temas;
            this.Editorial = editorial;
            this.Sinopsis = sinopsis;
            this.Ejemplares = new List<Ejemplar>();
            this.Autores = autores;
            this.Reservas = new List<Reserva>();
        }

       
        public int Id { get; set; }

        public string Titulo { get; set; }

        public virtual TipoMaterial Tipo { get; set; }

        [NotMapped]
        public string TemasString { get { return string.Join(",", Temas.Select(x => x.Nombre).ToList()); } }

        [NotMapped]
        public string AutoresString { get { return string.Join(",", Autores.Select(x => x.NombreCompleto).ToList()); } }

        public int Codigo { get; set; }

        public string Sinopsis { get; set; }


        public virtual Editorial Editorial { get; set; }


        public virtual ICollection<Tema> Temas { get; set; }


        public virtual ICollection<Ejemplar> Ejemplares { get; set; }


        public virtual ICollection<Autor> Autores { get; set; }


        public virtual ICollection<Reserva> Reservas { get; set; }
   
        
        //Busca una reserva pendiente sobre el material
        //si existe crea un prestamo sobre el ejemplar
        public virtual void Asignar (Ejemplar ejemplar)
        {
            Reserva reserva= this.Reservas.FirstOrDefault(c => c.EstaPendiente());
            
            //si existe reserva 
            if (reserva != null)
            {
                Prestamo prestamo = new Prestamo(reserva.Socio, ejemplar, reserva.CantDias);
                reserva.Concretar();
                ejemplar.PonerNoDisponible();
                ejemplar.AgregarPrestamo(prestamo);
            }
        }

        private Ejemplar BuscarDisponible()
        {

            foreach (var ej in this.Ejemplares)
            {
                if (ej.Disponible())
                    return ej;
            }
            return null;
        }


        public virtual void CrearPrestamo(Socio socio, int cantdias) {

            Ejemplar ej = this.BuscarDisponible();
            ej.PonerNoDisponible();
            Prestamo p = new Prestamo(socio, ej, cantdias);
            ej.AgregarPrestamo(p);
        }


        //Crea una nueva reserva sobre el material por X dias
        public virtual void CrearReserva(Socio socio, int cantdias) {
           
            Reserva reserva = new Reserva(socio, this, cantdias);

            this.Reservas.Add(reserva);
        }


        public virtual bool HayDisponible() {

            foreach (var ej in this.Ejemplares)
            {
                if (ej.Disponible())
                    return true;
            }
            return false;
        }

    }
}

